// LyraAbilityCost.h
// 版权归Epic Games, Inc.所有

#pragma once

#include "CoreMinimal.h"
  // 包含核心最小化头文件
#include "GameplayAbilitySpec.h"
  // 包含GameplayAbilitySpec头文件
#include "Abilities/GameplayAbility.h"
  // 包含GameplayAbility头文件
#include "LyraAbilityCost.generated.h"
  // 包含生成的反射头文件

class ULyraGameplayAbility;
// 前向声明ULyraGameplayAbility类

/**
 * ULyraAbilityCost
 * LyraGameplayAbility消耗的基类（例如，弹药或充能）
 */
UCLASS(MinimalAPI, DefaultToInstanced, EditInlineNew, Abstract)
// UCLASS宏，设置类为最小API、默认实例化、内联编辑新建、抽象类
class ULyraAbilityCost : public UObject
  // 定义ULyraAbilityCost类，继承自UObject
{
	GENERATED_BODY()
	// 生成反射体

public:
	ULyraAbilityCost()
	  // 构造函数
	{
	}

	/**
	 * 检查我们是否能负担此消耗
	 *
	 * 可以向OptionalRelevantTags（如果非空）添加失败原因标签，这可以在其他地方查询以确定如何提供用户反馈
	 * （例如，如果武器没有弹药，则发出咔嗒声）
	 * 
	 * 输入时Ability和ActorInfo保证非空，但OptionalRelevantTags可能为空指针
	 * 
	 * @return 如果可以支付能力消耗则返回true，否则返回false
	 */
	virtual bool CheckCost(const ULyraGameplayAbility* Ability, const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, FGameplayTagContainer* OptionalRelevantTags) const
	  // 虚拟函数：检查消耗
	{
		return true;
	}

	/**
	 * 将能力消耗应用于目标
	 *
	 * 注意：
	 * - 您的实现不需要检查ShouldOnlyApplyCostOnHit()，调用者会为您处理
	  * - 输入时Ability和ActorInfo保证非空
	 */
	virtual void ApplyCost(const ULyraGameplayAbility* Ability, const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo)
	  // 虚拟函数：应用消耗
	{
	}

	/** 如果为true，此消耗应仅在此能力成功命中时应用 */
	bool ShouldOnlyApplyCostOnHit() const { return bOnlyApplyCostOnHit; }
	// 函数：返回是否仅在命中时应用消耗

protected:
	/** 如果为true，此消耗应仅在此能力成功命中时应用 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Costs)
	// UPROPERTY宏，设置属性为任意位置可编辑、蓝图只读、分类为Costs
	bool bOnlyApplyCostOnHit = false;
	// 变量：是否仅在命中时应用消耗
};